package morenoapp.components.thinkgraphv2;

import edu.umd.cs.piccolo.PCanvas;
import edu.umd.cs.piccolo.PNode;
import edu.umd.cs.piccolo.util.PAffineTransform;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import morenoapp.MorenoApp;
import morenoapp.components.thinkgraphv2.nodes.CorrectionNode;
import morenoapp.components.thinkgraphv2.nodes.RelationshipItemNode;
import morenoapp.components.thinkgraphv2.nodes.RespondentItemNode;
import morenoapp.components.thinkgraphv2.nodes.SociogramNode;
import morenoapp.components.thinkgraphv2.nodes.VectorItemNode;
import morenoapp.model.data.MorenoAnswerFace;
import morenoapp.model.data.MorenoAnswerItemFace;
import morenoapp.model.data.MorenoModelFace;
import morenoapp.model.data.MorenoRespondentFace;
import morenoapp.model.view2.MorenoView2Face;

/**
 *
 * @author dmitry.mamonov
 */
public class ThinkgraphBaseCanvas extends PCanvas {
    /**
     * Конфигурация отображения социограммы (передаётся параметром).
     */
    MorenoView2Face config;
    /**
     * Преобразование переводяшее начало координат в левую верхнюю
     * точку видимой области.
     */
    PAffineTransform cameraNullTransform;
    /**
     * Узел для отображения основных элементов социограммы.
     */
    PNode graph;
    /**
     * Социограмма (подложка картинки) - единственный объект.
     */
    SociogramNode sociogram;
    /**
     * Список узлов респондентов.
     */
    List<RespondentItemNode> respondentNodes = new ArrayList<RespondentItemNode>();
    /**
     * Список узлов связей между респондентами.
     */
    List<VectorItemNode> vectorNodes = new ArrayList<VectorItemNode>();
    public ThinkgraphBaseCanvas(MorenoView2Face _config) {
        super();

        //remember passed configuration
        this.config = _config;

        //preserve and configure canvas environment
        cameraNullTransform = getCamera().getViewTransform();
        this.removeInputEventListener(this.getPanEventHandler());

        //configure base nodes
        sociogram = new SociogramNode(config);
        sociogram.setPaint(Color.yellow);
        getLayer().addChild(sociogram);

        graph = new PNode();
        graph.setPaint(null);
        getLayer().addChild(graph);
    }


    /**
     * Обновляет социограмму в соответствии с текущим состоянием модели.
     * Изменения применяются только в случае если компонет в настоящий
     * момент является видимым, в противном случае устанавливается
     * флаг что данные нужно будет перезагрузить при следующем показе объекта.
     */
    public void updateCanvasFromModel() {
        graph.removeAllChildren();
        respondentNodes.clear();
        vectorNodes.clear();
        MorenoModelFace model = MorenoApp.getModel();
        for (MorenoRespondentFace resp : model.getRespondentsList()) {
            //add respondent node
            RespondentItemNode item = new RespondentItemNode(config, resp);
            respondentNodes.add(item);
            graph.addChild(item);

            //add correction node
            vectorNodes.add(new CorrectionNode(config, resp));

            //add relationships edges
            for (MorenoAnswerFace answer : resp.getAnswerList()) {
                for (MorenoAnswerItemFace answerItem : answer.getAnswerItems()) {
                    if (answerItem.getTarget() != null) {
                        RelationshipItemNode rel = new RelationshipItemNode(config, answerItem);
                        vectorNodes.add(rel);
                    }
                }
            }
        }
        for (VectorItemNode vNode : vectorNodes) {
            graph.addChild(vNode);
        }

        invalidate();
        validate();
    }

    /**
     * This methos is specially overriden to support centered layout
     * of displayed elements.
     *
     * {@inheritDoc}
     */
    @Override
    public void setBounds(int x, int y, int w, int h) {
        getCamera().setViewTransform(cameraNullTransform);
        getCamera().translateView(w / 2, h / 2);
        super.setBounds(x, y, w, h);
    }
}



